/**
 * 视图模块
 * 负责拿到数据之后，进行构建网页，渲染网页内容，展示给用户
 */
#pragma once
#include<iostream>
#include<string>
#include<ctemplate/template.h>
#include"Model.hpp"
//#include"Model_sql.hpp"
namespace OnlineOJ
{
    namespace ns_View
    {
        const std::string ctemplate_path="./ctemplateHTML/";
        //视图类
        class View
        {
        public:
            //将所有题目数据构建成网页
            void AllQuestionsExpandHTML(const std::vector<ns_Model::QuestionPtr>& aq,std::string& html)
            {
                //形成要渲染的页面路径
                std::string src_html=ctemplate_path+"AllQuestions.html";
                //形成数据字典
                ctemplate::TemplateDictionary root("all_questions");
                //循环生成子字典
                for(const auto& q:aq)
                {
                    ctemplate::TemplateDictionary* child=root.AddSectionDictionary("questions_list");
                    child->SetValue("number",q->number);
                    child->SetValue("title",q->title);
                    child->SetValue("star",q->star);
                }

                //获取要渲染的页面
                ctemplate::Template* tpl=ctemplate::Template::GetTemplate(src_html,ctemplate::DO_NOT_STRIP);

                //进行渲染
                tpl->Expand(&html,&root);
            }
            //将指定题目数据构建成网页
            void OneQuestionExpandHTML(const ns_Model::QuestionPtr& q,std::string& html)
            {
                //形成要渲染的页面路径
                std::string src_html=ctemplate_path+"OneQuestion.html";
                //形成数据字典
                ctemplate::TemplateDictionary root("one_question");
                root.SetValue("number",q->number);
                root.SetValue("title",q->title);
                root.SetValue("star",q->star);
                root.SetValue("desc",q->desc);
                root.SetValue("pre_code",q->header);

                //获取要渲染的页面
                ctemplate::Template* tpl=ctemplate::Template::GetTemplate(src_html,ctemplate::DO_NOT_STRIP);

                //进行渲染
                tpl->Expand(&html,&root);
            }
        };

    }
}